package burubaka.controller.bat;

import java.util.logging.Logger;

import org.slim3.controller.Navigation;

import burubaka.BurubakaConstants;
import burubaka.bat.RaceCardBat;
import burubaka.bat.RacePayOffBat;
import burubaka.bat.RaceResultBat;
import burubaka.bat.RaceStartBat;
import burubaka.bat.RegistHorseMarkBat;
import burubaka.common.BurubakaUtil;
import burubaka.common.controller.Controller;
import burubaka.model.RaceInfo;
import burubaka.service.RaceInfoService;

public class RaceProgressController extends Controller {

	private static final Logger log = Logger.getLogger(RaceProgressController.class.getName());

	private RaceInfoService raceInfoService = new RaceInfoService();
	private RaceStartBat raceStartBat = new RaceStartBat();
	private RaceCardBat raceCardBat = new RaceCardBat();
	private RaceResultBat raceResultBat = new RaceResultBat();
	private RacePayOffBat racePayOffBat = new RacePayOffBat();

	private RegistHorseMarkBat registHorseMarkBat = new RegistHorseMarkBat();

	@Override
	public Navigation init() throws Exception {

		RaceInfo raceInfo = raceInfoService.getCurrentRaceInfo();

		// 進捗状況が終了の場合
		if (raceInfo == null || raceInfo.getProgress() == BurubakaConstants.PROGRESS_END) {
			log.info("レース登録開始");
			raceInfo = raceStartBat.execute();
			log.info("レース登録終了");
		}

		if (raceInfo == null) {
			return null;
		}
		// 進捗状況が予備登録の場合
		if (BurubakaUtil.isDoRaceCard(raceInfo)) {
			log.info("レース本登録開始");
			raceInfo = raceCardBat.execute();
			log.info("レース本登録終了");
		}

		// 進捗状況が本登録かつ締め切り時間がすぎていない場合
		if (raceInfo.getProgress() == BurubakaConstants.PROGRESS_RACECARD && !BurubakaUtil.isOverDeadline(raceInfo)) {
			log.info("オーナー印登録開始");
			registHorseMarkBat.execute();
			log.info("オーナー印登録終了");
		}

		// 開始時間が過ぎており、レース結果登録がまだ行われていない場合
		if (BurubakaUtil.isStartTimeOver(raceInfo) && raceInfo.getProgress() < BurubakaConstants.PROGRESS_RACERESULT) {
			log.info("レース結果登録開始");
			raceInfo = raceResultBat.execute();
			log.info("レース結果登録終了");
		}

		// 進捗状況がレース結果登録または配当計算開始の場合
		if (raceInfo.getProgress() == BurubakaConstants.PROGRESS_RACERESULT
				|| raceInfo.getProgress() == BurubakaConstants.PROGRESS_PAYOFF_START) {
			log.info("配当計算開始");
			raceInfo = racePayOffBat.execute();
			log.info("配当計算終了");
		}

		return null;
	}
}
